package cn.edu.gzy.web.server.service.impl;

import cn.edu.gzy.web.server.service.MovieInfoService;
import cn.edu.gzy.web.server.service.dto.MovieInfo;
import cn.edu.gzy.web.server.utils.JdbcUtil;
import cn.edu.gzy.web.server.utils.Page;
import cn.edu.gzy.web.server.utils.PageTool;
import com.alibaba.fastjson.util.TypeUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * @Author guzy
 * @Description
 * @Date 2022/4/24 17:41
 **/
@Service
public class MovieInfoServiceJdbcImpl implements MovieInfoService {

    @Autowired
    JdbcUtil jdbcUtil;

    @Autowired
    PageTool pageTool;


    /**
     * 分页获取全部影片信息
     *
     * @param page
     * @param size
     * @return
     */
    @Override
    public Page<MovieInfo> getAllMovieInfo(Integer page, Integer size) {
        //1、定义sql
        String sql = "select * from movie_info order by movie_id";
        //2、使用PageTool执行sqL获取分页对象Page
        Page moviePage = pageTool.getSqlPageResult(sql, page, size);
        if (moviePage != null) {
            //3、将Page中原始数据List<Map<String ,0bject>>转化成目标类型List<NovieInf0 >
            List<MovieInfo> movieList = convertMovieInfo(moviePage.getOriginalData());
            //4、将转化后的List<NovieInfo>写入Page类型的content中
            moviePage.setContent(movieList);
            //5、将Page中的原始数据释放,设置为null。moviePage.set0riginalData(null);
            moviePage.setOriginalData(null);
        }
        return moviePage;
    }

    /**
     * 根据关键字查询影片
     *
     * @param keywords
     * @param page
     * @param size
     * @return
     */
    @Override
    public Page<MovieInfo> getMoviesByKeywords(String keywords, Integer page, Integer size) {
        //1、定义sql
        String sql = "select * from movie_info where name like concat('%',?, '%') order by movie_id";
        //2、使用PageTool执行sql获取分页对象Page
        Page moviePage = pageTool.getSqlPageResult(sql, page, size, keywords);
        if (moviePage != null) {
            //3、将Page中原始数据List<Map<String,0bject>>转化成目标类型List<NovieInfo>
            List<MovieInfo> movieList = convertMovieInfo(moviePage.getOriginalData());
            //4、将转化后的List<MovieInfo>写入Page类型的content中
            moviePage.setContent(movieList);
            //5、将Page中的原始数据释放,设置为null。moviePage.set0riginalData(null);
            moviePage.setOriginalData(null);
        }
        return moviePage;
    }


    /**
     * 获取指定影片数据
     *
     * @param movieId
     * @return
     */
    @Override
    public MovieInfo getMovieById(Long movieId) {
        //1、定义sql
        String sql = "select * from movie_info where movie_id =?";
        // 2、使用JdbcUtil工具执行sql,获得查询结果Map<String, Object >
        Map<String, Object> movieMap = jdbcUtil.getOne(sql, movieId);
        MovieInfo movieInfo = null;
        if (movieMap != null) {
            //3、将Map<String,0bject>转化为MovieInfo对象
            movieInfo = convertMovieInfo(movieMap);
        }
        //返回movieInfo
        return movieInfo;
    }

    /**
     * 发布一步影片
     *
     * @param movieInfo
     * @return
     */
    @Override
    public MovieInfo publishMovieInfo(MovieInfo movieInfo) {
        //1、定义sql
        String sql = "insert into movie_info(name , img , name_en,length,movie_year , movie_publish_date)" +
                " values(? ,? ,?,?,?,?)";
        //2、使用JdbcUtil工具执行sql,获得自动增长id值
        Long result = jdbcUtil.execInsertAutoId(sql,
                movieInfo.getMovieName(),
                movieInfo.getMovieImage(),
                movieInfo.getMovieEnglishName(),
                movieInfo.getMovieLength(),
                movieInfo.getMovieYear(),
                movieInfo.getMoviePublishDate());
        // 3、将自动增长id值赋值给movieId字段
        if (result > 0) {
            movieInfo.setMovieId(result);
        }
        // 4、返回带有movieId值的MovieInfo对象
        return movieInfo;
    }

    /**
     * 修改一步影片
     *
     * @param movieInfo 影片数据对象
     * @return
     */
    @Override
    public MovieInfo modifyMovieInfo(MovieInfo movieInfo) {
        //1、定义sql
        String sql = "update movie_info set name=?" +
                ",img=?" +
                " , name_en=?" + " ,length=?" + " , movie_year=?" +
                " , movie_publish_date=? " + " where movie_id=?";
        //2、使用JdbcUtil工具执行sql,得到更新受影响行数
        Integer result = jdbcUtil.exec(sql, movieInfo.getMovieName(),
                movieInfo.getMovieImage(),
                movieInfo.getMovieEnglishName(), movieInfo.getMovieLength(),
                movieInfo.getMovieYear(),
                movieInfo.getMoviePublishDate(), movieInfo.getMovieId());
        //3、受影响行数 > 0 即保存成功,返回保存的数据对象
        if (result > 0) {
            return movieInfo;
        }
        //4、受影响行数不 > 0 返回null,表示保存失败
        return null;

    }

    /**
     * 删除一部影片
     *
     * @param movieId 需要删除的影片编码
     * @return
     */
    @Override
    public Boolean deleteMovieInfo(Long movieId) {
        //1、定义sql
        String sql = "delete from movie_info where movie_id=?";
        // 2、使用JdbcUtil工具执行sql,得到更新受影响行数
        Integer result = jdbcUtil.exec(sql, movieId);
        //3、受影响行数 > 0 表示删除成功,否则即为失败
        return result > 0;
    }


    /**
     * 将SQL执行得到的Map<String,0bject>数据转换为MovieInfo数据对象
     *
     * @param movieMap
     * @return
     */
    private MovieInfo convertMovieInfo(Map movieMap) {
        MovieInfo movieInfo = new MovieInfo();
        movieInfo.setMovieId(TypeUtils.castToLong(movieMap.get("movie_id")));
        movieInfo.setMovieImage(TypeUtils.castToString(movieMap.get("img")));
        movieInfo.setMovieLength(TypeUtils.castToInt(movieMap.get("length")));
        movieInfo.setMovieName(TypeUtils.castToString(movieMap.get("name")));
        movieInfo.setMovieRating(TypeUtils.castToFloat(movieMap.get("rating")));
        movieInfo.setMovieYear(TypeUtils.castToString(movieMap.get("movie_year")));
        movieInfo.setMovieEnglishName(TypeUtils.castToString(movieMap.get("name_en")));
        movieInfo.setMoviePublishDate(TypeUtils.castToString(movieMap.get("movie_publish_date")));
        return movieInfo;
    }


    /**
     * 将数据库获取的原始数据List<Nap<String, 0bject>>转化为数据对象列表List<NovieInfo>
     *
     * @param movieMapList
     * @return
     */
    private List<MovieInfo> convertMovieInfo(List<Map<String, Object>> movieMapList) {
        List<MovieInfo> resultList = new ArrayList<>();
        for (Map<String, Object> rowMap : movieMapList) {
            MovieInfo movieInfo = convertMovieInfo(rowMap);
            resultList.add(movieInfo);
        }
        return resultList;
    }
}
